package cn.tedu.csmall.order.webapi.service.imp;

import cn.tedu.csmall.cart.service.ICartService;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.pojo.order.model.Order;

import cn.tedu.csmall.commons.pojo.stock.dto.StockReduceCountDTO;
import cn.tedu.csmall.commons.restful.JsonPage;
import cn.tedu.csmall.order.service.IOrderService;
import cn.tedu.csmall.order.webapi.mapper.OrderMapper;
import cn.tedu.csmall.stock.service.IStockService;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.aspectj.weaver.ast.Or;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@DubboService
@Service
@Slf4j
public class OrderServiceImpl implements IOrderService {

    @Autowired
    private OrderMapper orderMapper;
    @DubboReference
    private IStockService dubboStockService;
    @DubboReference
    private ICartService dubboCartService;


    @Override
    public void insertOrder(OrderAddDTO orderAddDTO) {
        // 这里新增订单要先减少库存(要调用stock项目的方法)
        // dubbo远程调用,减少库存
        StockReduceCountDTO stockReduceCountDTO = new StockReduceCountDTO();
        stockReduceCountDTO.setReduceCount(orderAddDTO.getCount());
        stockReduceCountDTO.setCommodityCode(orderAddDTO.getCommodityCode());
        dubboStockService.reduceCommodityCount(stockReduceCountDTO);
        // 再删除购物车中的商品(要调用cart项目的方法)
        dubboCartService.deleteUserCart(orderAddDTO.getUserId(),orderAddDTO.getCommodityCode());
        // 上面的操作后面微服务学习后会实现,现在暂时新增订单信息
        // 实例化订单对象
        Order order = new Order();
        // 同名属性复制
        BeanUtils.copyProperties(orderAddDTO,order);
        orderMapper.insertOrder(order);
        log.info("新增订单完成!{}",order);
    }

    // 分页查询所有订单
    // pageNum是查询的页码
    // pageSize是分页查询的每页条数
    @Override
    public JsonPage<Order> getAllOrderByPage(Integer pageNum, Integer pageSize){
        // 这行代码是利用PageHelper框架指定分页查询参数的指令
        // 这行代码生效后,下一次运行的数据库查询会自动按照分页参数计算limit的数值,添加到sql语句之后
        PageHelper.startPage(pageNum,pageSize);
        // 调用查询所有订单的持久层方法
        List<Order> list = orderMapper.findAllOrders();
        // 分页查询后,除了查询结果,PageHelper框架会自动计算一个分页信息类
        // 分页信息中包含当前页码,总页数,总条数,当前是不是第一页最后一页等各种信息
        // PageInfo类出现的方式就是直接实例化这个累心对象,分页信息会自动赋值到这个对象中
        PageInfo<Order> pageInfo = new PageInfo<>(list);
        return JsonPage.restPage(pageInfo);
    }
}
